package com.mcb_wxc.http;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;
import java.util.Map;
import java.util.Vector;

/**
 * @类名称: HttpRequester
 * @类描述: TODO(HTTP请求对象   )
 * @创建人: xiaoxie   
 * @创建时间: 2014-9-10 下午04:38:00
 * @修改人: xiaoxie   
 * @修改时间: 2014-9-10 下午04:38:00
 * @修改备注: 
 * @version 1.0
 
 */
public class HttpRequester {     
    private String defaultContentEncoding;     
      
    public HttpRequester() {     
        this.defaultContentEncoding = Charset.defaultCharset().name();     
    }     
      
    /**   
     * 发送GET请求   
     *    
     * @param urlString   
     *            URL地址   
     * @return 响应对象   
     * @throws IOException   
     */    
    public HttpRespons sendGet(String urlString) throws IOException {     
        return this.send(urlString, "GET", null, null);     
    }     
      
    /**   
     * 发送GET请求   
     *    
     * @param urlString   
     *            URL地址   
     * @param params   
     *            参数集合   
     * @return 响应对象   
     * @throws IOException   
     */    
    public HttpRespons sendGet(String urlString, Map<String, String> params)     
            throws IOException {     
        return this.send(urlString, "GET", params, null);     
    }     
      
    /**   
     * 发送GET请求   
     *    
     * @param urlString   
     *            URL地址   
     * @param params   
     *            参数集合   
     * @param propertys   
     *            请求属性   
     * @return 响应对象   
     * @throws IOException   
     */    
    public HttpRespons sendGet(String urlString, Map<String, String> params,     
            Map<String, String> propertys) throws IOException {     
        return this.send(urlString, "GET", params, propertys);     
    }     
      
    /**   
     * 发送POST请求   
     *    
     * @param urlString   
     *            URL地址   
     * @return 响应对象   
     * @throws IOException   
     */    
    public HttpRespons sendPost(String urlString) throws IOException {     
        return this.send(urlString, "POST", null, null);
    }     
      
    /**   
     * 发送POST请求   
     *    
     * @param urlString   
     *            URL地址   
     * @param params   
     *            参数集合   
     * @return 响应对象   
     * @throws IOException   
     */    
    public HttpRespons sendPost(String urlString, Map<String, String> params)     
            throws IOException {     
        return this.send(urlString, "POST", params, null);
    }     
      
    /**   
     * 发送POST请求   
     *    
     * @param urlString   
     *            URL地址   
     * @param params   
     *            参数集合   
     * @param propertys   
     *            请求属性   
     * @return 响应对象   
     * @throws IOException   
     */    
    public HttpRespons sendPost(String urlString, Map<String, String> params,     
            Map<String, String> propertys) throws IOException {     
        return this.send(urlString, "POST", params, propertys);
    }

    /**
     * 发送POST请求
     *
     * @param urlString
     *            URL地址
     * @param params
     *            参数集合
     * @param propertys
     *            请求属性
     * @param timeout
     *            超时时间 单位：秒
     * @return 响应对象
     * @throws IOException
     */
    public HttpRespons sendPost(String urlString, Map<String, String> params,
                                Map<String, String> propertys, int timeout) throws IOException {
        return this.send(urlString, "POST", params, propertys, timeout);
    }

    /**
     * 发送HTTP请求
     *
     * @param urlString
     * @return 响映对象
     * @throws IOException
     */
    private HttpRespons send(String urlString, String method,
                             Map<String, String> parameters, Map<String, String> propertys)
            throws IOException {

        return this.send(urlString, method, parameters, propertys, 5);
    }



    /**   
     * 发送HTTP请求   
     *    
     * @param urlString   
     * @return 响映对象   
     * @throws IOException   
     */    
    private HttpRespons send(String urlString, String method,     
            Map<String, String> parameters, Map<String, String> propertys, int timeout)
            throws IOException {     
        HttpURLConnection urlConnection = null;     
      
        if (method.equalsIgnoreCase("GET") && parameters != null) {     
            StringBuffer param = new StringBuffer();     
            int i = 0;     
            for (String key : parameters.keySet()) {     
                if (i == 0)     
                    param.append("?");     
                else    
                    param.append("&");     
                param.append(key).append("=").append(parameters.get(key));     
                i++;     
            }     
            urlString += param;     
        }
        URL url = new URL(urlString);
        urlConnection = (HttpURLConnection) url.openConnection();
      
        urlConnection.setRequestMethod(method);     //设置请求方式
        urlConnection.setDoOutput(true); //表示用url输出
        urlConnection.setDoInput(true);  //表示用url输入
        urlConnection.setUseCaches(false);    //不设置缓存
        urlConnection.setReadTimeout(timeout * 1000);   //设置过期时间为timeout *1000  timeout：毫秒
        urlConnection.setConnectTimeout(timeout * 1000);  //设置过期时间为timeout *1000  timeout：毫秒
        urlConnection.addRequestProperty("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
        if (propertys != null)
            for (String key : propertys.keySet()) {     
                urlConnection.addRequestProperty(key, propertys.get(key));     
            }     
      
        if (method.equalsIgnoreCase("POST") && parameters != null) {     
            StringBuffer param = new StringBuffer();     
            for (String key : parameters.keySet()) {     
                param.append("&");     
                param.append(key).append("=").append(parameters.get(key));     
            }     
            urlConnection.getOutputStream().write(param.toString().getBytes("UTF-8"));
            urlConnection.getOutputStream().flush();     
            urlConnection.getOutputStream().close();     
        }     
      
        return this.makeContent(urlString, urlConnection);     
    }



    /**   
     * 得到响应对象   
     *    
     * @param urlConnection   
     * @return 响应对象   
     * @throws IOException   
     */    
    private HttpRespons makeContent(String urlString,     
            HttpURLConnection urlConnection) throws IOException {     
        HttpRespons httpResponser = new HttpRespons();     
        try {     
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(),"utf-8"));
            httpResponser.contentCollection = new Vector<String>();     
            StringBuffer temp = new StringBuffer();     
            String line = bufferedReader.readLine();     
            while (line != null) {     
                httpResponser.contentCollection.add(line);     
                temp.append(line).append("\r\n");     
                line = bufferedReader.readLine();     
            }     
            bufferedReader.close();     
      
            String ecod = urlConnection.getContentEncoding();     
            if (ecod == null)     
                ecod = this.defaultContentEncoding;     
      
            httpResponser.urlString = urlString;     
      
            httpResponser.defaultPort = urlConnection.getURL().getDefaultPort();     
            httpResponser.file = urlConnection.getURL().getFile();     
            httpResponser.host = urlConnection.getURL().getHost();     
            httpResponser.path = urlConnection.getURL().getPath();     
            httpResponser.port = urlConnection.getURL().getPort();     
            httpResponser.protocol = urlConnection.getURL().getProtocol();     
            httpResponser.query = urlConnection.getURL().getQuery();     
            httpResponser.ref = urlConnection.getURL().getRef();     
            httpResponser.userInfo = urlConnection.getURL().getUserInfo();     
      
            httpResponser.content = temp.toString();     
            httpResponser.contentEncoding = ecod;     
            httpResponser.code = urlConnection.getResponseCode();     
            httpResponser.message = urlConnection.getResponseMessage();     
            httpResponser.contentType = urlConnection.getContentType();     
            httpResponser.method = urlConnection.getRequestMethod();     
            httpResponser.connectTimeout = urlConnection.getConnectTimeout();     
            httpResponser.readTimeout = urlConnection.getReadTimeout();     
      
            return httpResponser;     
        } catch (IOException e) {     
            throw e;     
        } finally {     
            if (urlConnection != null)     
                urlConnection.disconnect();     
        }     
    }


    /**
     * 发送post请求 json格式
     * @param url
     * @param param
     * @return
     */
    public static String sendPost(String url, String param) {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("Accept", "application/json");
            conn.setRequestProperty("Content-Type", "application/json");
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            // 发送请求参数
            out.print(param);
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常!"+e);
            e.printStackTrace();
        }
        //使用finally块来关闭输出流、输入流
        finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
        return result;
    }



    /**   
     * 默认的响应字符集   
     */    
    public String getDefaultContentEncoding() {     
        return this.defaultContentEncoding;     
    }     
      
    /**   
     * 设置默认的响应字符集   
     */    
    public void setDefaultContentEncoding(String defaultContentEncoding) {     
        this.defaultContentEncoding = defaultContentEncoding;     
    }     
}   